﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Collections;
using System.IO;

namespace BioPro1
{
    public partial class Form1 : Form
    {
        private SekwencjeNarzedzia narzedzia;
        private ISet<char> alfabet;

        public Form1()
        {
            InitializeComponent();
            inicjalizuj_alfabet_Click(this, new EventArgs());
        }

        private void dodaj_sekwencje_Click(object sender, EventArgs e)
        {
            //if (sekwencje_tb.Text != "")
            //{
            //    sekwencje_lb.Items.Add(sekwencje_tb.Text);
            //    sekwencje_tb.Text = "";
            //}
        
        }

        private void usun_zaznaczone_Click(object sender, EventArgs e)
        {
            //for (int nCount = 0; nCount < sekwencje_lb.SelectedItems.Count; nCount++)
            //{
            //    sekwencje_lb.Items.Remove(sekwencje_lb.SelectedItems[nCount].ToString());
            //    nCount--;
            //}
        }

        private void sklej_sekwencje_Click(object sender, EventArgs e)
        {
            String[] s = sekwencjeRTB.Text.Split('\n');


            //String[] s = new String[sekwencje_lb.Items.Count];
            //for(int i = 0; i < sekwencje_lb.Items.Count; i++)
            //{
            //    s[i] = sekwencje_lb.Items[i].ToString();
            //}

            String[] wynik = narzedzia.sklejSekwencje(s);
            wielodopasowanie_lb.Items.Clear();

            foreach(string st in wynik)
                wielodopasowanie_lb.Items.Add(st);


        }

        private void wyczysc_wielodopasowanie_lb_Click(object sender, EventArgs e)
        {
            wielodopasowanie_lb.Items.Clear();
        }


        private void dodaj_litere_Click(object sender, EventArgs e)
        {
            //if (litera_tb.Text != "" )
            //{
            //    alfabet_lb.Items.Add(litera_tb.Text);
            //    litera_tb.Text = "";
            //    inicjalizuj_alfabet.Enabled = true;
            //}
                
        }

        private void usun_elementy_alfabetu_Click(object sender, EventArgs e)
        {
            //for (int nCount = 0; nCount < alfabet_lb.SelectedItems.Count; nCount++)
            //{
            //    alfabet_lb.Items.Remove(alfabet_lb.SelectedItems[nCount].ToString());
            //    nCount--;
            //}
        }

        private void inicjalizuj_alfabet_Click(object sender, EventArgs e)
        {
            alfabet = new HashSet<char>();
            String[] macierzPodobienstwaLinie = wczytajMacierzZPliku("podobienstwa.txt");
            String[] literyZMacierzy = macierzPodobienstwaLinie[0].Split('\t');
            for (int i = 1; i < literyZMacierzy.Length; i++)
            {
                alfabet.Add(literyZMacierzy[i].ToCharArray()[0]);
            }


            //string[] litery = alfabetRTB.Text.Split('\n');

            //foreach (var litera in litery)
            //{
            //    //String s = litera.ToString();
            //    //alfabet.Add(litera.ToCharArray()[0]);
            //}
            
            //podobienstwa_dgv.ColumnCount = alfabet_lb.Items.Count + 1;
            //podobienstwa_dgv.RowCount = alfabet_lb.Items.Count + 1;

            podobienstwa_dgv.ColumnCount = alfabet.Count + 1;
            podobienstwa_dgv.RowCount = alfabet.Count + 1;

            int iterator = 1;
            foreach (char row in alfabet)
            {
                podobienstwa_dgv[iterator, 0].Value = row;
                podobienstwa_dgv[0, iterator].Value = row;
                iterator++;
            }

            foreach(DataGridViewColumn column in podobienstwa_dgv.Columns)
            {
                column.Width = 30;
            }

            for(int i = 1; i < podobienstwa_dgv.Columns.Count; ++i)
            {
                String[] liniaZMacierzy = macierzPodobienstwaLinie[i].Split('\t');
                for(int j = 1; j < podobienstwa_dgv.Rows.Count; ++j)
                {
                    podobienstwa_dgv[j,i].Value = liniaZMacierzy[j];
                    //if(podobienstwa_dgv[i, 0].Value.ToString() == "-" && podobienstwa_dgv[0, j].Value.ToString() == "-")
                    //{
                    //    podobienstwa_dgv[i, j].Value = "-1";
                    //}
                    //else if(podobienstwa_dgv[i, 0].Value.ToString() == podobienstwa_dgv[0, j].Value.ToString())
                    //{
                    //    podobienstwa_dgv[i, j].Value = "1";
                    //}
                    //else
                    //{
                    //    podobienstwa_dgv[i, j].Value = "0";
                    //}
                }
            }

            podobienstwa_btn_Click(this, new EventArgs());
         
        }

        private String[] wczytajMacierzZPliku(String nazwaPliku)
        {
            try
            {
                using (StreamReader sr = new StreamReader("..\\..\\podobienstwa.txt"))
                {
                    return sr.ReadToEnd().Split('\n');
                }
            }
            catch (Exception ee)
            {
                Console.WriteLine("The file could not be read:");
                Console.WriteLine(ee.Message);
            }
            return null;
        }

        private void wczytajDoDGV()
        {

        }

        private void podobienstwa_btn_Click(object sender, EventArgs e)
        {
            IDictionary<char, IDictionary<char, double>> podobienstwa = new Dictionary<char, IDictionary<char, double>>();

            foreach (char c1 in alfabet)
            {
                podobienstwa[c1] = new Dictionary<char, double>();
            }
            for (int i = 1; i < alfabet.Count+1; i++)
                {
                    char row_letter = podobienstwa_dgv[0, i].Value.ToString().ToCharArray()[0];
                    for (int j = 1; j < alfabet.Count + 1; j++)
                    {
                        char column_letter = podobienstwa_dgv[j, 0].Value.ToString().ToCharArray()[0];
                        podobienstwa[row_letter][column_letter] = Double.Parse(podobienstwa_dgv[j, i].Value.ToString());
                    }
                }
                
            narzedzia = new SekwencjeNarzedzia(podobienstwa, alfabet);

            //inicjalizuj_alfabet.Enabled = false;
            //dodaj_sekwencje.Enabled = true;
            sklej_sekwencje.Enabled = true;
        }


        private void sekwencje_tb_TextChanged(object sender, EventArgs e)
        {
           
        }

        private void dodaj_wielo_1_Click(object sender, EventArgs e)
        {
            //if (wielo_1_tb.Text != "")
            //{
            //    wielo_1_lb.Items.Add(wielo_1_tb.Text);
            //    wielo_1_tb.Text = "";
            //}
        }

        private void dodaj_wielo_2_Click(object sender, EventArgs e)
        {
            //if (wielo_2_tb.Text != "")
            //{
            //    wielo_2_lb.Items.Add(wielo_2_tb.Text);
            //    wielo_2_tb.Text = "";
            //}
        }

        private void polacz_Click(object sender, EventArgs e)
        {
            //String[] wielodopasowanie1 = new String[wielo_1_lb.Items.Count];
            //for (int i = 0; i < wielo_1_lb.Items.Count; i++)
            //{
            //    wielodopasowanie1[i] = wielo_1_lb.Items[i].ToString();
            //}

            //String[] wielodopasowanie2 = new String[wielo_2_lb.Items.Count];
            //for (int i = 0; i < wielo_2_lb.Items.Count; i++)
            //{
            //    wielodopasowanie2[i] = wielo_2_lb.Items[i].ToString();
            //}

            String[] wielodopasowanie1 = wielodopasowanie1RTB.Text.Split('\n');
            String[] wielodopasowanie2 = wielodopasowanie2RTB.Text.Split('\n');

            String[] wynik = narzedzia.zlozDwaWielodopasowania(wielodopasowanie1, wielodopasowanie2);

            zlaczenie_wielodopasowan.Items.Clear();
            foreach (string s in wynik)
                zlaczenie_wielodopasowan.Items.Add(s);

        }

        private void dodaj_wielo_param_Click(object sender, EventArgs e)
        {
            //if (wielo_param_tb.Text != "")
            //{
            //    wielodopasowanie_parametry_lb.Items.Add(wielo_param_tb.Text);
            //    wielo_param_tb.Text = "";
            //}
        }

        private void oblicz_parametry_Click(object sender, EventArgs e)
        {
            //String[] wielodopasowanieParametry = new String[wielodopasowanie_parametry_lb.Items.Count];
            //for (int i = 0; i < wielodopasowanie_parametry_lb.Items.Count; i++)
            //{
            //    wielodopasowanieParametry[i] = wielodopasowanie_parametry_lb.Items[i].ToString();
            //}

            String[] wielodopasowanieParametry = parametryRTB.Text.Split('\n');

            IDictionary<char, double>[] profil = narzedzia.zwrocProfil(wielodopasowanieParametry);
            double sp = narzedzia.wartoscSP(wielodopasowanieParametry);
            String slowokonsensusowe = narzedzia.zwrocSlowoKonsensusowe(wielodopasowanieParametry);

            profil_tb.Text = profilNaTekst(profil, narzedzia.Alfabet);

            slowo_kons_tb.Text = slowokonsensusowe.ToString();
            sp_tb.Text = sp.ToString();
        }

        private void wyczysc_zlaczenie_btn_Click(object sender, EventArgs e)
        {
            zlaczenie_wielodopasowan.Items.Clear();
        }

        String profilNaTekst(IDictionary<char, double>[] profil, ISet<char> alfabet)
        {
            char[] litery = alfabet.ToArray();
            Array.Sort(litery);

            StringBuilder b = new StringBuilder();
            // wypisz naglowki kolumn
            b.Append("\t");
            for(int i = 0; i < profil.Length; ++i)
            {
                b.Append((i+1).ToString() + "\t");
            }
            b.AppendLine();

            // wypisz wiersz dla kazdej z liter alfabetu
            foreach(char c in litery)
            {
                b.Append(c + "\t");
                for(int i = 0; i < profil.Length; ++i)
                {
                    if(profil[i].ContainsKey(c))
                    {
                        b.Append(profil[i][c]);
                    }
                    else
                    {
                       b.Append(0);
                    }
                    b.Append("\t");
                }
                b.AppendLine();
            }
            return b.ToString();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            podobienstwa_btn_Click(sender, e);
            List<String> linieDoPliku = new List<String>();
            for (int i = 0; i < podobienstwa_dgv.Rows.Count; i++)
            {
                String linia = "";
                for (int j = 0; j < podobienstwa_dgv.Columns.Count; j++)
                {
                    linia += podobienstwa_dgv[j,i].Value;
                    linia.Replace("\r", "");
                    if (j != podobienstwa_dgv.Columns.Count-1) linia += '\t';
                }
                linieDoPliku.Add(linia);
            }
            using (StreamWriter outfile = new StreamWriter("..\\..\\podobienstwa.txt", false))
            {
                foreach (String linia in linieDoPliku)
                {
                    outfile.WriteLine(linia);
                }
            }
        }
    }
}
